package utils

import (
	"math/rand"
	"strings"
	"time"
)

// 字符集常量
const (
	// 数字字符集
	NumberChars = "0123456789"
	// 大写字母字符集
	UpperChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	// 小写字母字符集
	LowerChars = "abcdefghijklmnopqrstuvwxyz"
	// 所有字母字符集
	LetterChars = UpperChars + LowerChars
	// 字母和数字字符集
	AlphaNumericChars = NumberChars + LetterChars
)

// 初始化随机数生成器
func init() {
	rand.Seed(time.Now().UnixNano())
}

// GenerateRandomString 生成指定长度的随机字符串
// length: 字符串长度
// chars: 字符集，如果为空则使用字母和数字字符集
func GenerateRandomString(length int, chars string) string {
	if chars == "" {
		chars = AlphaNumericChars
	}

	result := strings.Builder{}
	result.Grow(length)

	for i := 0; i < length; i++ {
		result.WriteByte(chars[rand.Intn(len(chars))])
	}

	return result.String()
}

// GenerateCouponCode 生成优惠券码
// prefix: 前缀，可选
// length: 总长度，包括前缀
func GenerateCouponCode(prefix string, length int) string {
	if length <= len(prefix) {
		length = len(prefix) + 8
	}

	// 生成随机部分
	randomPart := GenerateRandomString(length-len(prefix), UpperChars+NumberChars)

	// 组合优惠券码
	return prefix + randomPart
}

// GenerateNumericCode 生成数字验证码
// length: 验证码长度
func GenerateNumericCode(length int) string {
	return GenerateRandomString(length, NumberChars)
}

// GenerateUniqueCode 生成带时间戳的唯一码
// 基于时间戳和随机数生成，格式为：前缀 + 时间戳 + 随机字符串
func GenerateUniqueCode(prefix string, randomLength int) string {

	// 转为36进制字符串（0-9A-Z）
	timestampStr := strings.ToUpper(time.Now().Format("060102150405"))

	// 生成随机字符串
	randomStr := GenerateRandomString(randomLength, UpperChars+NumberChars)

	// 组合唯一码
	return prefix + timestampStr + randomStr
}
